home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CU Amiga Super CD-ROM 11
/
CU Amiga Magazine's Super CD-ROM 11 (1997)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1997-06].iso
/
cucd
/
graphics
/
mpimage
/
si
/
saveilbm.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-12-01
|
6KB
|
202 lines
/* saveilbm.c 04/92 C. Scheppner CBM
*
* High-level ILBM save routines
*
* 37.10 07/92 - use scr->RastPort.BitMap instead of &scr->BitMap
* for future compatibility
* 39.5 11/92 - raised BODYBUF size from 4096 to 5004 (should allow saving
* of bitmaps up to pixel width of 16384)
*/
#define INTUI_V36_NAMES_ONLY
#include "iffp/ilbm.h"
#include "iffp/ilbmapp.h"
#define CATCOMP_NUMBERS
#include "messages.h"
//extern struct Library *GfxBase;
#if 0
/* screensave.c
*
* Given an ILBMInfo with a currently available (not in use)
* ParseInfo->iff IFFHandle, a screen pointer, filename, and
* optional chunklist, will save screen as an ILBM
* The struct Chunk *chunklist1 and 2 are for chunks you wish written
* out other than BMHD, CMAP, and CAMG (they will be screened out
* because they are computed and written separately).
*
* Note - screensave passes NULL for transparent color and mask
*
* Returns 0 for success or an IFFERR (libraries/iffparse.h)
*/
LONG screensave(struct ILBMInfo *ilbm,
struct Screen *scr,
struct Chunk *chunklist1, struct Chunk *chunklist2,
UBYTE *filename)
{
extern struct Library *GfxBase;
Color32 *colortable32;
UWORD *colortable, count;
ULONG modeid;
LONG error;
int k;
if(GfxBase->lib_Version >= 36)
modeid=GetVPModeID(&scr->ViewPort);
else
modeid = scr->ViewPort.Modes & OLDCAMGMASK;
count = scr->ViewPort.ColorMap->Count;
error = IFFERR_NOMEM;
if(GfxBase->lib_Version >= 39)
{
if(colortable32 = (Color32 *)AllocMem(sizeof(Color32) * count, MEMF_CLEAR))
{
GetRGB32(scr->ViewPort.ColorMap,0L,count,(ULONG *)colortable32);
error = saveilbm(ilbm, scr->RastPort.BitMap, modeid,
scr->Width, scr->Height, scr->Width, scr->Height,
colortable32, count, 32,
mskNone, 0,
chunklist1, chunklist2, filename);
FreeMem(colortable32,sizeof(Color32) * count);
}
}
else
{
if(colortable = (UWORD *)AllocMem(count << 1, MEMF_CLEAR))
{
for(k=0; k<count; k++)
colortable[k]=GetRGB4(scr->ViewPort.ColorMap,k);
error = saveilbm(ilbm, scr->RastPort.BitMap, modeid,
scr->Width, scr->Height, scr->Width, scr->Height,
colortable, count, 4,
mskNone, 0,
chunklist1, chunklist2, filename);
FreeMem(colortable,count << 1);
}
}
return(error);
}
#endif
/* saveilbm
*
* Given an ILBMInfo with a currently available (not-in-use)
* ParseInfo->iff IFFHandle, a BitMap ptr,
* modeid, widths/heights, colortable, ncolors, bitspergun,
* masking, transparent color, optional chunklists, and filename,
* will save the bitmap as an ILBM.
*
* if bitspergun=4, colortable is words, each with nibbles 0RGB
* if bitspergun=8, colortable is byte guns of RGBRGB etc. (like a CMAP)
* if bitspergun=32, colortable is ULONG guns of RGBRGB etc.
* Only the high eight bits of each gun will be written to CMAP.
* Four bit guns n will be saved as nn
*
* The struct Chunk *chunklist is for chunks you wish written
* other than BMHD, CMAP, and CAMG (they will be screened out)
* because they are calculated and written separately
*
* Returns 0 for success, or an IFFERR
*/
LONG saveilbm(struct ILBMInfo *ilbm,
struct BitMap *bitmap, ULONG modeid,
WORD width, WORD height, WORD pagewidth, WORD pageheight,
APTR colortable, UWORD ncolors, UWORD bitspergun,
WORD masking, WORD transparentColor,
struct Chunk *chunklist1, struct Chunk *chunklist2,
UBYTE *filename)
{
struct IFFHandle *iff;
struct Chunk *chunk;
ULONG chunkID;
UBYTE *bodybuf;
LONG size, error = 0L;
#define BODYBUFSZ 5004
iff = ilbm->ParseInfo.iff;
if(!(modeid & 0xFFFF0000)) modeid &= OLDCAMGMASK;
if(!(bodybuf = AllocMem(BODYBUFSZ,MEMF_PUBLIC)))
{
message(SI(MSG_IFFP_NOMEM));
return(IFFERR_NOMEM);
}
if(!(error = openifile(&ilbm->ParseInfo, filename, IFFF_WRITE)))
{
D(bug("Opened %s for write\n",filename));
error = PushChunk(iff, ID_ILBM, ID_FORM, IFFSIZE_UNKNOWN);
D(bug("After PushChunk FORM ILBM - error = %ld\n", error));
initbmhd(&ilbm->Bmhd, bitmap, masking, cmpByteRun1, transparentColor,
width, height, pagewidth, pageheight, modeid);
D(bug("Error before putbmhd = %ld\n",error));
CkErr(putbmhd(iff,&ilbm->Bmhd));
if(colortable) CkErr(putcmap(iff,colortable,ncolors,bitspergun));
if(ilbm->IFFPFlags & IFFPF_NOMONITOR) modeid &= (~MONITOR_ID_MASK);
ilbm->camg = modeid;
D(bug("before putcamg - error = %ld\n",error));
CkErr(putcamg(iff,&modeid));
D(bug("Past putBMHD, CMAP, CAMG - error = %ld\n",error));
/* Write out chunklists 1 & 2 (if any), except for
* any BMHD, CMAP, or CAMG (computed/written separately)
*/
for(chunk = chunklist1; chunk; chunk = chunk->ch_Next)
{
D(bug("chunklist1 - have a %.4s\n",&chunk->ch_ID));
chunkID = chunk->ch_ID;
if((chunkID != ID_BMHD)&&(chunkID != ID_CMAP)&&(chunkID != ID_CAMG))
{
size = chunk->ch_Size==IFFSIZE_UNKNOWN ?
strlen(chunk->ch_Data) : chunk->ch_Size;
D(bug("Putting %.4s\n",&chunk->ch_ID));
CkErr(PutCk(iff, chunkID, size, chunk->ch_Data));
}
}
for(chunk = chunklist2; chunk; chunk = chunk->ch_Next)
{
chunkID = chunk->ch_ID;
D(bug("chunklist2 - have a %.4s\n",&chunk->ch_ID));
if((chunkID != ID_BMHD)&&(chunkID != ID_CMAP)&&(chunkID != ID_CAMG))
{
size = chunk->ch_Size==IFFSIZE_UNKNOWN ?
strlen(chunk->ch_Data) : chunk->ch_Size;
D(bug("Putting %.4s\n",&chunk->ch_ID));
CkErr(PutCk(iff, chunkID, size, chunk->ch_Data));
}
}
/* Write out the BODY
*/
CkErr(putbody(iff, bitmap, NULL, &ilbm->Bmhd, bodybuf, BODYBUFSZ));
D(bug("Past putbody - error = %ld\n",error));
CkErr(PopChunk(iff)); /* close out the FORM */
closeifile(&ilbm->ParseInfo); /* and the file */
}
FreeMem(bodybuf,BODYBUFSZ);
return(error);
}